实现一个自己的NSNotificationCenter

我一直觉得代码会随着时间的久更新变动的快,但是思想这个东西是越经过时间越经典的一个东西。

如何获取一些好的思想呢?多看别人的代码 多去总结和思考 多交流 分享 面试 等等 都是获取一些好的想法的途径。

接下来进入正题:

如何来实现一个自己的NSNotificationCenter?由于我们看不到源码 所以也不知道苹果具体是怎么实现的。

但是大致肯定的是:系统的通知中心,就是用观察者模式实现的

NSNotificationCenter是一个单例模式,保存了所有注册的观察者

当有消息要发送,遍历观察者列表,给对应的观察者转发消息 。

具体代码实现请看我的github地址:

https://github.com/jiecoding/DIYNSNotificationCenter

下面的是简单回顾下系统的通知中心(高手可以直接跳过),对于有什么好的建议请及时提出来,谢谢!

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationSelector) name:@"notificationName" object:nil];

NSNotificationCenter消息通信机制介绍(KVO)

作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的.

注册通知:即要在什么地方接受消息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@” mytest” object:nil];
参数介绍:
addObserver: 观察者,即在什么地方接收通知;
  selector: 收到通知后调用何种方法;
  name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
发送通知:调用观察者处的方法。
[[NSNotificationCenter defaultCenter] postNotificationName:@”mytest” object:searchFriendArray];
参数:
postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
object:传递的参数
注册方法的写法:

  • (void) mytest:(NSNotification*) notification
    {
    id obj = [notification object];//获取到传递的对象
    }

附:注册键盘升启关闭消息

//键盘升起 [[NSNotificationCenter……
简单的使用参照:http://my.oschina.net/gexun/blog/385799

上面简单看了下NSNotificationCenter的使用和简单构成原理。

然后接下来我们思考下,如果我们自己实现应该如何做?

第一步 先创建一个单例 ,然后写添加监听和 发送广播

  • (DIYNotificationSingle )sharedManager
    {
    static DIYNotificationSingle
    ManagerInstance = nil;
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
    ManagerInstance = [[self alloc] init];
    
    });
    return ManagerInstance;
    }
  • (void)diyAddObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject
    {

    Entity *entity = [[Entity alloc] init];
    entity.observer = observer;
    entity.aSelector = aSelector;
    entity.notificationName = aName;
      if(!_observers)
      {
          _observers = [[NSMutableArray alloc] init];
      }
    
    [_observers addObject:entity];
    

    }

  • (void)diyPostNotificationName:(NSString )aName object:(nullable id)anObject
    {
    for (Entity
    observer in _observers)
    {

    [observer.observer performSelector:observer.aSelector withObject:nil];
    

    }

}

  • (void)diyRemoveObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject
    {
    for (int i = 0; i < _observers.count ; i++){

    Entity *observerE = [_observers objectAtIndex:i];
    if([observerE.observer isEqual:observer]){
        [_observers removeObjectAtIndex:i];
    }
    

    }
    NSLog(@”remove:%@”,_observers);

}
关于消息处理方法runtime等 可以预览下 http://www.cnblogs.com/buro79xxd/archive/2012/04/10/2440074.html